package main;

import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Vector;

import javax.swing.JOptionPane;

import voSetting.PortVO;
import voSetting.SetMyInfoVO;
import voSetting.StateSetVO;
import chat.Chatting;
import file.FileClientThread;
import file.FileDownload;
import file.FileInfoVO;
import file.FileTransfer;

public class ClientThread extends Thread {
	
	Object pageType = null;
	String client_name = "";
	Socket socket;
	FileTransfer temp_ft;
	InputStream is;
	ObjectInputStream ois;	
	OutputStream os;
	ObjectOutputStream oos;
	
	private SetMyInfoVO smvo;
	
	private final int CHAT = 1;
	private final int FILE = 2;
	boolean flag = true;
	
	//파일정보를 전송하기 위한 백터 입니다.
	Vector<FileInfoVO> vector_fileInfo = null;
	
	public ClientThread(Socket s){	// 소켓이 필요한 이유는 실시간으로 데이터를 받기 위해서
		this.socket = s;			// 각각의 값을 초기화 하고 
		start();					// 스레드를 시작한다
	}
	
	/*
	 * 각 주축이 되는 페이지 정보로 변경시킴
	 * 상태변화 
	 * 	1. 로그인 페이지 정보
	 *  2. 메인 페이지 정보
	 */
	public void typeChange(Object main, String client_name){
		this.pageType = main;
		this.client_name = client_name;
	}
	
	public void run(){
		try{
			os = socket.getOutputStream();
			oos = new ObjectOutputStream(os);	// 아웃풋 먼저  
			
			is = socket.getInputStream();		// 소캣에 인풋스트림을 가져와서 값 전달. 
			ois = new ObjectInputStream(is);	 

			while (flag) {				
				StateSetVO ssvo = (StateSetVO) ois.readObject(); 	// 1. 최상위 Vo
				
				switch (ssvo.getVo_type() ) {	// 1. 최상위 VO
				case 1 : // 인증 및 로그인 처리
					System.out.println("클라이언트측 서버에서 응답 받음");
					
					setSmvo((SetMyInfoVO) ssvo.getVo());
					
					if(getSmvo().isLogin_state()){	// 접속 승인시
						Main main = new Main();
						main.setInfo(this);
						Login login = (Login) pageType;
						login.dispose();
						main.setLbl_name(getSmvo().getE_name());
						main.setLbl_position(getSmvo().getE_position());
						main.setLbl_team(getSmvo().getD_tname());
						main.setVisible(true);
						typeChange(main, "main");
						
					}
					else{
						// 이부분 필요 없음  (if부분)
						System.out.println("조건이 맞지않음");
						if( client_name.equals("main")){
							Main main = (Main) pageType;
							flag = false;
							// 메시지 띄워주고 종료
							// run상태의 대화창 close
							main.show_exception_message();
							main.clientThread = null;
							
						}
						else{
							System.out.println("현재 창이 메인이 아님");
							Login login = (Login) pageType;
							System.out.println("로그인 페이지");
							// 문제가 있다고 띄워줌
							login.show_exception_message();
							System.out.println("메시지를 뿌려줌");
						}
					}
					
					break;
				case 2 : // 룸 생성
					
					PortVO pvo = (PortVO) ssvo.getVo();
					System.out.println("vo받아옴 command : "+pvo.getCommand());
					if(pvo.getCommand() == CHAT){	// 채팅창은 
						System.out.println("클라이언트 스레드");
						System.out.println("채팅 클라이언트에 전해줄 포트번호 : " + pvo.getPort());
						
						new Chatting(pvo.getPort(), (Main)pageType);	// 포트번호, 메신저(메인)
												
					}
					else if(pvo.getCommand() == FILE){
						System.out.println("파일 전송(업로드)");
						System.out.println("pvo: "+pvo.getM_id());
						System.out.println("smvo: "+smvo.getM_id());
						if(pvo.getM_id().equals(smvo.getM_id())){	// 자신이 보낸 요청이 처리되어 답이 돌아왔을 때 (새로운 창을 생성할 필요가 없음)
							System.out.println("파일 전송(업로드)");
							System.out.println("업로드 하는 사람: "+pvo.getM_id());
							System.out.println("파일 업로드 포트번호: "+pvo.getPort());
							temp_ft.setPortNumber(pvo.getPort());
							System.out.println("start_upload()실행전");
							temp_ft.start_upload();
						}
						else{	// 새로운 창을 생성하여 데이터를 셋팅해야함
							System.out.println("파일 전송(다운로드)");
							System.out.println("다운로드 받는 사람: "+pvo.getM_id());
							System.out.println("파일 다운로드 포트번호: "+pvo.getPort());
							temp_ft.setPortNumber(pvo.getPort());
							System.out.println("start_download()실행전");
							temp_ft.start_download();
						}
					}
					else{
						
					}
					break;
				case 3 : // 상태 정보
					break;
				case 4 : // 로그아웃
					flag = false;
					if(client_name.equals("main")){
						Main main = (Main) pageType;
						main.show_exception_message();
						main.clientThread = null;
					}
					// 남은 채팅 및 파일 전송 등의 창을 전부 닫는다.
					return ;
				}
			}	
		}catch(Exception e){
			
		}
	}
	public SetMyInfoVO getSmvo() {
		return smvo;
	}
	public void setSmvo(SetMyInfoVO smvo) {
		this.smvo = smvo;
	}
	public ObjectOutputStream getOos() {
		return oos;
	}
	public void setOos(ObjectOutputStream oos) {
		this.oos = oos;
	}
	public FileTransfer getTemp_ft() {
		return temp_ft;
	}
	public void setTemp_ft(FileTransfer temp_ft) {
		this.temp_ft = temp_ft;
	}
}	
